/**
 * 1、数据库连接
 */
var host = 'localhost';
var user = 'root';
var password = '123456';
var database = 'xp-platform';

function mysql() {
    var mysql = require('mysql');
    return mysql;
}

function __createConnection__() {
    var connection = mysql().createConnection({
        host: host,
        user: user,
        password: password,
        database: database
    });
    connection.connect();
    return connection;
}

function execute(callback) {
    var connection = __createConnection__();
    try {
        callback(connection);
    }
    finally {
        end(connection);
    }
    delete connection;
}

function __validateArgs(cfg) {
    if (!cfg) {
        alert('必须传入参数');
        return false;
    }
    if (!cfg.tableName) {
        alert('表名不能为空');
        return false;
    }

    cfg.data = cfg.data || {};

    cfg.success = cfg.success || function (d) {

    };
    cfg.fail = cfg.fail || function (d) {

    };
    return true;
}

/**
 *
 * @param {tableName,data,success,fail} cfg  表名称,单表
 */
function insert(cfg) {
    if (!__validateArgs(cfg)) {
        return false;
    }
    ;
    execute(function (conn) {
        conn.query("INSERT INTO " + cfg.tableName + " SET ?", cfg.data, function (error, results, fields) {
            if (error) {
                cfg.fail(error);
                throw error;
            } else {
                cfg.success(results);
            }

        });
    });
}


function __validateUpdataSelectArgs(cfg) {
    if (!cfg) {
        alert('必须传入参数');
        return false;
    }
    if (!cfg.sql) {
        alert('必须传入sql');
        return false;
    }
    if (!cfg.data) {
        alert('必须传入数组');
        return false;
    }
    //cfg.data  = cfg.data ||[];

    cfg.success = cfg.success || function (d) {

    };
    cfg.fail = cfg.fail || function (d) {

    };
    return true;
}

/**
 * @param {sql,data,success,fail} cfg
 */
function update(cfg) {
    if (!__validateUpdataSelectArgs(cfg))
        return false;
    //sql,data,callback
    //参数的处理
    execute(function (conn) {
        conn.query(cfg.sql, cfg.data, function (error, results, fields) {
            if (error) {
                cfg.fail(error);
                throw error;
            } else {
                cfg.success(results);
            }
        });
    });

}

function remove(cfg) {
    update(cfg);

}

/**
 *
 * @param {sql,data,callback} cfg  表名称,单表
 *
 */
function select(cfg) {
    if (!__validateUpdataSelectArgs(cfg))
        return false;
    cfg.timeout = 20000;
    execute(function (conn) {
        conn.query({
            sql: cfg.sql,
            timeout: cfg.timeout, // 20s
            values: cfg.data
        }, function (error, results, fields) {
            if (error) {
                cfg.fail(error);
                throw error;
            } else {
                cfg.success(results);
            }
            //console.log(results);
        });
    });


}

function end(connection) {
    try {
        connection.end();
    } catch (error) {
        throw error;
    } finally {
        if (connection.state === 'authenticated') {
            connection.end();
        }
    }
}
